package com.lecing.tpl;

import com.alibaba.druid.support.logging.Log;
import com.alibaba.druid.support.logging.LogFactory;
import net.sf.jxls.transformer.XLSTransformer;
import org.apache.poi.openxml4j.exceptions.InvalidFormatException;
import org.apache.poi.ss.usermodel.*;
import org.apache.poi.xssf.usermodel.XSSFCell;
import org.apache.poi.xssf.usermodel.XSSFRow;
import org.apache.poi.xssf.usermodel.XSSFSheet;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;

import java.io.*;
import java.util.*;

/**
 * Excel 模板引擎
 * 思路：
 * 1.读取excel模板 对模板变量进行解析;
 *   难点：模板命名（标识）,对模板上变量的封装。
 * 2.查询sql返回map对象,map的key 是标识模板,value则是对应（赋值给模板）的数据;
 * 3.将解析的模板变量集合与对应map key中的value 进行一一绑定，重新生成excel数据;
 *   难点：需用Poi动态操作excel
 * 4.将最终生成的excel下载并查看。
 *
 * Created by liucs on 2018/5/29.
 */
public class LcTplEngine {

    private static Log log= LogFactory.getLog(LcTplEngine.class);

    //表字段属性（key）
    private Map<String,Object> fields=new HashMap<>();

    //表值
    private Map<String,Object> values=new HashMap<>();




    public static  void main(String[] args) throws Exception{
        String tplFile="template/loanOutTpl.xlsx";
        String com_path = LcTplEngine.class.getClassLoader().getResource("./template/loanOutTpl.xlsx").getPath();
//        parseTpl2Exl(tplFile,ExlsConstant.M_REPAY_LST);
        //获取模板变量集合
        ReadXLSX readXLSX=new ReadXLSX(tplFile);
      //  Map<String,Object> map=getSheetVars4Map(readXLSX,0); //可以传sheet标签名
//        System.out.println("leader====:"+map.get("leader"));
//        System.out.println("accountant====:"+map.get("accountant"));

        /**
        Set<Map.Entry<String,String>> sets= map.entrySet();
       for (Iterator<Map.Entry<String,String>> iter=sets.iterator();iter.hasNext();){
           Map.Entry<String,String> entry=iter.next();
           System.out.println("key:"+entry.getKey());
       }*/



    }
    /**
     * 解析模板生成excel
     * @param tplFilePath
     */
    /**
    public static void parseTpl2Exl(String tplFilePath){
        //1.读取excel模板文件，解析特定sheet上的模板变量
       // String filePath="template/loanOutTpl.xlsx";
        ReadXLSX readXLSX=new ReadXLSX(tplFilePath);
        String[] sheetsNames=readXLSX.getSheetsName();
        int idx=0;
        for(int i=0;i<sheetsNames.length;i++){
            if(sheetsNames[i].equals(ExlsConstant.LEDGER)){//月总账
//                idx=readXLSX.getSheetIdx(ExlsConstant.LEDGER);
                System.out.println("----得到sheet索引是----："+i);
                log.info("======"+sheetsNames[i]+"=======");
                //取得对应sheet里的变量
                Map<String,Object> map=getSheetVars4Map(readXLSX,i);
                log.info(sheetsNames[i]+"-变量数："+map.size());

               log.info("inSum:" + map.get("inSum")+"\toutSum:" + map.get("outSum"));
               log.info("mRepaySum:" + map.get("mRepaySum")+"\tmCordSum:" + map.get("mCordSum"));

            }
            //月付还款明细
            if (sheetsNames[i].equals(ExlsConstant.M_REPAY_LST)){
               // idx=readXLSX.getSheetIdx(ExlsConstant.M_REPAY_LST);
                System.out.println("----得到sheet索引是----："+i);
                log.info("======"+sheetsNames[i]+"=======");
                //取得对应sheet里的变量
                Map<String,Object> map=getSheetVars4Map(readXLSX,i);
                log.info(sheetsNames[i]+"-变量数："+map.size());
                String flat=(String)map.get("flat"); //公寓
                String month=(String )map.get("month"); //月份
                log.info("flat:"+flat+"\t month:"+month);
            }
            //年付还款明细
            if (sheetsNames[i].equals(ExlsConstant.Y_REPAY_LST)){
            }
        }
    }
     */





    /**
     * 根据模板引擎生成excel
     * @param tplFile 模板文件
     * @param outFile 输出excel文件
     * @param mapdata map数据
     */
    public static void genExcelFromTpl(String tplFile,Map<String,Object> mapdata,String outFile){
        try {
            XLSTransformer former = new XLSTransformer();
            former.transformXLS(tplFile, mapdata, outFile);
            File oFile=new File(outFile);
            if(oFile.exists()){
                log.info("====生成excel文件成功!====");
            }
        } catch (IOException e) {
            e.printStackTrace();
        } catch (InvalidFormatException e) {
            e.printStackTrace();
        }
    }
        /**
         * 赋值模型数据
         * 插值到模板
         * @param items
         * @param sourceFilePath
         * @param targetFilePath
         * @param sheetIdx
         * @return
         */
    public static boolean replaceModel2Xlsx(List<Map<String,Object>> items, String sourceFilePath, String targetFilePath,int sheetIdx) {
        boolean b=true;
        try{
            InputStream is=new FileInputStream(sourceFilePath);
            XSSFWorkbook xwb=new XSSFWorkbook(is);
            XSSFSheet sheet=xwb.getSheetAt(sheetIdx);
            Iterator rows=sheet.rowIterator();
            String value="";
            Map<String,Object> item=null;
            XSSFRow xRow=null;
            //如果是数据集合
//            if (items.size()>1){
//                item=items.get(1);
//                xRow= (XSSFRow) ExcelUtil.insertRow(xwb, sheet, 4,items.size());
//            }
            while (rows.hasNext()){
                xRow= (XSSFRow) rows.next();
                if (xRow!=null){
                    int num = xRow.getLastCellNum();
                    for(int i=0;i<num;i++){ //num:6
                        XSSFCell cell=xRow.getCell(i);
                        if (cell!=null ){
                            if(cell.getCellTypeEnum().equals(CellType.STRING)){
                               // cell.setCellType(CellType.STRING);
                                value= cell.getStringCellValue();
                                if(value!=null) {
                                      for(int j=0;j<items.size();j++){
                                          Set<String> keySet = items.get(j).keySet();
                                          Iterator<String> it = keySet.iterator();
                                          while (it.hasNext()) {
                                              String text = it.next();
                                              if(value.equalsIgnoreCase(text)) {
                                                  cell.setCellValue((String) items.get(j).get(text));
                                                  break;
                                              }
                                          }
                                    }
                                } else {
                                    cell.setCellValue("");
                                }
                             }
                            }
                        }
                }
            }
            // 输出文件
            FileOutputStream fileOut = new FileOutputStream(targetFilePath);
            xwb.write(fileOut);
            fileOut.close();
        }catch (Exception e){
            b = false;
            e.printStackTrace();
        }
        return b;
    }


}
